<?php
class Information extends MY_Controller {

	// Modelos usados en las funciones del controlador
	var $modelIndicatorDAO = 'Indicator_dao';
	var $modelIndicatorDTO = 'Indicator_dto';

	var $modelOutputDAO = 'Output_dao';
	var $modelOutputDTO = 'Output_dto';
	
	var $modelOutcomeDAO = 'Outcome_dao';
	var $modelOutcomeDTO = 'Outcome_dto';
	
	var $modelBusinessLineDAO = 'Business_line_dao';
	var $modelBusinessLineDTO = 'Business_line_dto';
	
	var $modelUserDAO = 'User_dao';
	var $modelUserDTO = 'User_dto';
	
	// Vistas utilizadas en las funciones del controlador
	var $gridView = 'information/information_all_view';
	var $reportView = 'reports/information_report';
	var $resultMessageView = '';	
	
	// Datos para pasar a las vistas
	var $pageTitle = '';
	
	private $controllerName = 'information';
	
	public function __construct()
    {
    	parent::__construct();
		
		$this->resultMessageView = $this->template->getResultMessageView();		
	}
	
	private function _loadIndicatorModels()
	{
		$this->load->model("$this->modelIndicatorDAO", 'Indicator_dao');
		$this->load->model("$this->modelIndicatorDTO", 'Indicator_dto');
	}
	
	private function _loadOutputModels()
	{
		$this->load->model("$this->modelOutputDAO", 'Output_dao');
		$this->load->model("$this->modelOutputDTO", 'Output_dto');
	}
	
	private function _loadOutcomeModels()
	{
		$this->load->model("$this->modelOutcomeDAO", 'Outcome_dao');
		$this->load->model("$this->modelOutcomeDTO", 'Outcome_dto');
	}
	
	private function _loadBusinessLineModels()
	{
		$this->load->model("$this->modelBusinessLineDAO", 'Business_line_dao');
		$this->load->model("$this->modelBusinessLineDTO", 'Business_line_dto');
	}
	
	private function _loadUserModels()
	{
		$this->load->model("$this->modelUserDAO", 'User_dao');
		$this->load->model("$this->modelUserDTO", 'User_dto');
	}
	
	public function getAll($idBusinessLine = 0 , $idOutcome = 0 , $idOutput = 0, $idIndicator = 0)
	{	
		// La acción sólo puede realizarla un administrador. Controlo los permisos antes de continuar
		if(parent::permitted($this->controllerName, 'getAll')) {
			$this->pageTitle = 'All Items';
			$dataView = $this->_getAllItems($idBusinessLine, $idOutcome, $idOutput);
			
			$dataView['idIndicator'] = $idIndicator;
			$dataView['changeOwner'] = TRUE;

			if($idIndicator != 0) {
				// Valido si el indicador está asociado a una ronda abierta y si el owner ya realizó 
				// el resumen, para no permitir cambiarlo (Owner)
				$dataView['changeOwner'] = $this->Indicator_dao->canChangeOwner($idIndicator);
			}
			
			$this->_loadUserModels();
			$dataView['users'] = $this->User_dao->obtenerEnabledUsers();
			
			parent::_loadViews($this->gridView, $dataView);	
		}
		else { 
			parent::loadForbiddenView();
		}
	}
	
	private function _getAllItems($idBusinessLine = 0, $idOutcome = 0, $idOutput = 0)
	{
		//Cargo los modelos que voy a utilizar
		$this->_loadOutputModels();
		$this->_loadOutcomeModels();
		$this->_loadBusinessLineModels();
		$this->_loadIndicatorModels();
		
		//Obtengo la lista con todas las  BL
		$dataView['business_lines'] = $this->Business_line_dao->obtenerObjetos();
		
		//Obtengo la lista de los OutComes segun la BL Seleccionada (si hubiera alguna seleccionada)
		if ($idBusinessLine == 0) { $dataView['outcomes'] =  array(); }
		else { 	$condicionesBL = array('idBusinessLine' => $idBusinessLine);
				$dataView['outcomes'] = $this->Outcome_dao->obtenerObjetos($condicionesBL);	 }		
		
		// Obtengo la lista de Outputs según el outcome seleccionado. Si no se seleccionó ninguno, no busco nada
		if ($idOutcome == 0) { $dataView['outputs'] =  array(); }
		else { $condicionesOutcome = array('idOutcome' => $idOutcome);
				$dataView['outputs'] = $this->Output_dao->obtenerObjetos($condicionesOutcome); }		
			
		// Obtengo la lista de indicadores según el output seleccionado. Si no se seleccionó ninguno, no busco nada
		if ($idOutput == 0) { $dataView['indicators'] =  array(); }
		else { $condicionesOutput = array('idOutput' => $idOutput);
			$dataView['indicators'] = $this->Indicator_dao->obtenerObjetos($condicionesOutput); }
			
		$dataView['idBusinessLine'] = $idBusinessLine;
		$dataView['idOutcome'] = $idOutcome;
		$dataView['idOutput'] = $idOutput;	
		
		return $dataView;
	}

	public function downloadReport($idBusinessLine, $idOutcome = 0, $idOutput = 0)
	{	
		if(parent::permitted($this->controllerName, 'downloadReport')) {
			
			$this->load->library('to_excel');
			$objPHPExcel = $this->to_excel->getExcelObject();
			
			// Establecer propiedades del Excel
			$objPHPExcel->getProperties()
			->setTitle("ReportingAZO - Tree Structure")
			->setSubject("ReportingAZO - Tree Structure");

			// Crear y asociar la imagen del logo al Excel
			$objDrawing = $this->to_excel->getExcelDrawing();
			$objDrawing->setName('Logo');
			$objDrawing->setDescription('Logo');
			$objDrawing->setPath('././images/logo.png');
			$objDrawing->setCoordinates('A1');
			$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());

			
			$styleArray = array(
				'font' => array(
					'name' => 'Arial', 
					'size' => 10
				),
				'alignment' => array(
					'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_LEFT,
					'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
				)
			);
			// Defino estilos
			$objPHPExcel->getDefaultStyle()->applyFromArray($styleArray);
			//$objPHPExcel->getDefaultStyle()->getFont()->setSize(10);

			$styleArray = array(
				'font' => array(
					'bold' => true,
					'name' => 'Arial', 
					'size' => 10
				),
				'alignment' => array(
					'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
					'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
				),
				'borders' => array(
					'top' => array(
						'style' => PHPExcel_Style_Border::BORDER_THIN,
					),
					'bottom' => array(
						'style' => PHPExcel_Style_Border::BORDER_THIN,
					),
				)
			);
			$objPHPExcel->getActiveSheet()->getStyle('A5:D5')->applyFromArray($styleArray);


			// Arranco de la fila 6 ya que el logo ocupa esos lugares y el título
			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A5', 'Business line');
			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('B5', 'Outcome');
			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('C5', 'Output');
			$objPHPExcel->setActiveSheetIndex(0)->setCellValue('D5', 'Indicator');
			$contadorFila = 6;
			
			// Utilizo estas variables para saber desde qué fila a qué fila tengo que combinar las celdas
			$filaBLmergeDesde = $contadorFila;
			$contadorBL = 0;
			$filaOCmergeDesde = $contadorFila;
			$contadorOC = 0;
			$filaOPmergeDesde = $contadorFila;
			$contadorOP = 0;

			$this->_loadBusinessLineModels();
			$this->_loadOutcomeModels();
			$this->_loadOutputModels();
			$this->_loadIndicatorModels();
			
			$b_lines = $this->Business_line_dao->getTreeStructure($idBusinessLine);
			if ($b_lines->num_rows() > 0)
			{	
				foreach ($b_lines->result_array() as $bl) {
					if($contadorFila != 6){
						// Agrego una fila vacía para separar entre BL
						$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A' . $contadorFila, '');
						$contadorFila++;
					}
					$filaBLmergeDesde = $contadorFila;
					$contadorBL = 0;
					$objPHPExcel->setActiveSheetIndex(0)->setCellValue('A' . $contadorFila, $bl['name']);
					
					$outcomes = $this->Outcome_dao->getTreeStructure($bl['id'], $idOutcome);
					foreach ($outcomes->result_array() as $ocm) {
						$filaOCmergeDesde = $contadorFila;
						$contadorOC = 0;
						$objPHPExcel->setActiveSheetIndex(0)->setCellValue('B' . $contadorFila, $ocm['name']);
						
						$outputs = $this->Output_dao->getTreeStructure($ocm['id'], $idOutput);
						foreach ($outputs->result_array() as $op) {
							$filaOPmergeDesde = $contadorFila;
							$contadorOP = 0;
							$objPHPExcel->setActiveSheetIndex(0)->setCellValue('C' . $contadorFila, $op['name']);
							
							$indicators = $this->Indicator_dao->getTreeStructure($op['id']);
							foreach ($indicators->result_array() as $ind) {
								$indicador_contenido = $ind['name'];
								if($ind['idOwner'] != 0) $indicador_contenido .= '. Owner: ' . $ind['firstname'] . ' ' . $ind['lastname'];
								
								$objPHPExcel->setActiveSheetIndex(0)->setCellValue('D' . $contadorFila, $indicador_contenido);
								$contadorOP++;
								$contadorFila++;
							} // foreach indicator

							if($contadorOP == 0) { // No tiene indicadores asociados, sumo una fila (vacía)
								$contadorFila++;
								$contadorOP = 1;
							}
							else { // Si tiene más de un indicador, combino las celdas del output
								if($contadorOP > 1)
									$objPHPExcel->getActiveSheet()->mergeCells('C' . $filaOPmergeDesde . ':C' . ($filaOPmergeDesde + $contadorOP -1));
							}

							$contadorOC += $contadorOP;
						} // foreach outputs

						if($contadorOC == 0) { // No tiene outputs asociados, sumo una fila (para que arranque en la que sigue)
							$contadorFila++;
							$contadorOC = 1;
						}
						else { // Si tiene más de un output, combino las celdas
							if($contadorOC > 1)
								$objPHPExcel->getActiveSheet()->mergeCells('B' . $filaOCmergeDesde . ':B' . ($filaOCmergeDesde + $contadorOC - 1));
						}

						$contadorBL += $contadorOC;
					} // foreach outcomes


					if($contadorBL == 0) { // No tiene outcomes asociados, sumo una fila (para que arranque en la que sigue)
						$contadorFila++;
					}
					else { // Si tiene más de un outcome, combino las celdas
						if($contadorBL > 1)
							$objPHPExcel->getActiveSheet()->mergeCells('A' . $filaBLmergeDesde . ':A' . ($filaBLmergeDesde + $contadorBL - 1));
					}
				}
			}

			$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
			$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
			$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setAutoSize(true);
			$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setAutoSize(true);		

			// Renombrar Hoja
			$objPHPExcel->getActiveSheet()->setTitle('Tree Structure');

			// Establecer la hoja activa, para que cuando se abra el documento se muestre primero.
			$objPHPExcel->setActiveSheetIndex(0);

			$dataView['objWriter'] = $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
			$dataView['objPHPExcel'] = $objPHPExcel;

			$this->load->view($this->reportView, $dataView);
			}
		else { 
			parent::loadForbiddenView();
		}
	}
}